home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / qed / src / aktion.c next >
C/C++ Source or Header  |  1998-06-26  |  4KB  |  195 lines

  1. #include "global.h"
  2. #include "aktion.h"
  3. #include "rsc.h"
  4.  
  5. extern handle_msg(int *msg);    /* -> event.c */
  6.  
  7. int    akt_handle;
  8.  
  9. static long        max_value;
  10. static int        interupt;
  11. static OBJECT    *aktion = NULL;
  12.  
  13. static void redraw(int start, int depth, int x, int y, int w, int h)
  14. {
  15.     GRECT        r, r1;
  16.     
  17.     r.g_x = x; r.g_y = y; r.g_w = w; r.g_h = h;
  18.     wind_update(BEG_UPDATE);
  19.     hide_mouse_if_needed(&r);
  20.     wind_get_grect(akt_handle, WF_FIRSTXYWH, &r1);
  21.     while (r1.g_w != 0 && r1.g_h != 0)
  22.     {
  23.         if (rc_intersect(&r, &r1))
  24.             objc_draw(aktion, start, depth, r1.g_x, r1.g_y, r1.g_w, r1.g_h);
  25.         wind_get_grect(akt_handle, WF_NEXTXYWH, &r1);
  26.     }
  27.     show_mouse();
  28.     wind_update(END_UPDATE);
  29. }
  30.  
  31. static void move(int x, int y)
  32. {
  33.     GRECT    r;
  34.  
  35.     wind_get_grect(akt_handle, WF_CURRXYWH, &r);
  36.     r.g_x = x;
  37.     r.g_y = y;
  38.     wind_set_grect(akt_handle, WF_CURRXYWH, &r);
  39.     wind_get_grect(akt_handle, WF_WORKXYWH, &r);
  40.     aktion[0].ob_x = r.g_x;
  41.     aktion[0].ob_y = r.g_y;
  42. }
  43.  
  44.  
  45.  
  46. void start_aktion(char *str, bool inter, long max)
  47. {
  48.     int    d;
  49.     GRECT    r1, r2;
  50.  
  51.     if (aktion == NULL)
  52.     {
  53.         rsrc_gaddr(R_TREE, AKTION,    &aktion);
  54.         fix_dial(aktion);
  55.     }
  56.         
  57.     max_value = max(max, 1);
  58.     set_string(aktion, ATEXT, str);
  59.     aktion[ABOX2].ob_width = 1;
  60.     set_flag(aktion, AESC, HIDETREE, !inter);
  61.     interupt = inter;
  62.  
  63.     /* Zentrieren, nur beim ersten Mal */
  64.     if (aktion[0].ob_x == 0 && aktion[0].ob_y == 0)
  65.         form_center(aktion, &d, &d, &d, &d);    
  66.     
  67.     r1.g_x = aktion[0].ob_x;
  68.     r1.g_y = aktion[0].ob_y;
  69.     r1.g_w = aktion[0].ob_width;
  70.     r1.g_h = aktion[0].ob_height;
  71.     wind_calc_grect(WC_BORDER, (NAME|MOVER|BACKDROP), &r1, &r2);
  72.     akt_handle = wind_create_grect((NAME|MOVER|BACKDROP), &r1);
  73.     if (akt_handle > 0)
  74.     {
  75.         /* Menü abschalten */
  76.         disable_menu();
  77.         wind_set_str(akt_handle, WF_NAME, " qed ");
  78.         wind_open_grect(akt_handle, &r2);
  79.     }
  80. }
  81.  
  82. bool do_aktion(char *str, long value)
  83. {
  84.     int    msg[8], kreturn, d, event;
  85.     long     max_len, help;
  86.     GRECT    r;
  87.     bool    ret = TRUE;
  88.     
  89.     /* zunächst Box updaten */
  90.     if (str[0] != EOS)
  91.     {
  92.         set_string(aktion, ATEXT, str);
  93.         get_objframe(aktion, ATEXT, &r);
  94.         redraw(ROOT, MAX_DEPTH, r.g_x, r.g_y, r.g_w, r.g_h);
  95.     }
  96.     
  97.     max_len = aktion[ABOX1].ob_width;
  98.     help = max((max_len * value) / max_value,1);
  99.     help = min(max_len, help);
  100.     if (aktion[ABOX2].ob_width != help)
  101.     {
  102.         aktion[ABOX2].ob_width = (int) help;
  103.         get_objframe(aktion, ABOX2, &r);
  104.         redraw(ABOX2, 0, r.g_x, r.g_y, r.g_w, r.g_h);
  105.     }
  106.  
  107.     /* nachschauen, ob es irgendwelche GEM-Events gibt */
  108.     do
  109.     {
  110.         event = evnt_multi(MU_MESAG|MU_KEYBD|MU_TIMER, 1, 1, 1, 
  111.                                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  112.                                 msg, 1, &d, &d, &d, &d, &kreturn, &d);
  113.         if (event & MU_MESAG)
  114.         {
  115.             switch (msg[0])
  116.             {
  117.                 case WM_REDRAW :
  118.                     if (msg[3] == akt_handle)
  119.                         redraw(ROOT, MAX_DEPTH, msg[4], msg[5], msg[6], msg[7]);
  120.                     else
  121.                         handle_msg(msg);
  122.                     break;
  123.                     
  124.                 case WM_MOVED :
  125.                     if (msg[3] == akt_handle)
  126.                         move(msg[4], msg[5]);
  127.                     else
  128.                         handle_msg(msg);
  129.                     break;
  130.     
  131.                 case WM_TOPPED :
  132.                 case WM_NEWTOP :
  133.                 case WM_ONTOP :        
  134.                     wind_set(akt_handle, WF_TOP, 0, 0, 0, 0);
  135.                     break;
  136.     
  137.                 case WM_SIZED:
  138.                 case WM_BOTTOMED:
  139.                     /* ignore */
  140.                     break;
  141.     
  142.                 case AP_TERM :
  143.                     ret = FALSE;
  144.                     break;
  145.             }
  146.         }
  147.         if (event & MU_KEYBD)
  148.         {
  149.             if (interupt && kreturn == 0x011B)        /* ESC */
  150.                 ret = FALSE;
  151.         }
  152.     }
  153.     while (event & MU_MESAG);    /* alle Messages auswerten */
  154.     return ret;
  155. }
  156.  
  157. void end_aktion (void)
  158. {
  159.     if (akt_handle > 0)
  160.     {
  161.         int    msg[8], d, event = 0;
  162.  
  163.         wind_close(akt_handle);
  164.         wind_delete(akt_handle);
  165.         akt_handle = -1;
  166.  
  167.         /*
  168.          * Alle auflaufenden Redraw-Messages abarbeiten, damit
  169.          * alle Fenster sauber sind, wenn der Dialog beendet ist.
  170.         */
  171.         while (event != MU_TIMER)
  172.         {
  173.             event = evnt_multi(MU_MESAG|MU_TIMER, 1, 1, 1, 
  174.                                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  175.                                     msg, 1, &d, &d, &d, &d, &d, &d);
  176.             if ((event & MU_MESAG) && (msg[0] == WM_REDRAW))
  177.                 handle_msg(msg);
  178.         }
  179.  
  180.         /* Menü wieder an */
  181.         enable_menu();
  182.     }
  183. }
  184.  
  185. void redraw_aktion(void)
  186. {
  187.     if (akt_handle > 0)
  188.     {
  189.         GRECT    r;
  190.         
  191.         get_objframe(aktion, 0, &r);
  192.         redraw(ROOT, MAX_DEPTH, r.g_x, r.g_y, r.g_w, r.g_h);
  193.     }
  194. }
  195.